from comunidadcyt.Eventos.forms import EventForm
from django.shortcuts import render_to_response
from django.core.context_processors import csrf
from comunidadcyt.Eventos.models import Eventos
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.models import User
from django.http import HttpResponse
from django.utils import simplejson
from comunidadcyt.gruposDeInvestigacion.models import GruposDeInvestigacion
from comunidadcyt.departamentos.models import Departamentos
from comunidadcyt.util.permisos import puedeCrearEventos, puedeEditarEventos
from django.core.urlresolvers import reverse
from django.template.context import RequestContext
from django.core import serializers
from django.http import HttpResponseRedirect

def index(request):
    request.breadcrumbs('Eventos',request.path)  
    return render_to_response('Eventos/index.html',{'user':request.user},context_instance = RequestContext(request))

def obtenerEvento(request,object_id):
    if int(object_id):
        try:
            objectoEvento = Eventos.objects.get(id=object_id)
        except ObjectDoesNotExist:
            return 'No existe el objecto Evento'
    else:
        return 'No existe el objecto Evento'
    return objectoEvento

def create_event_view(request):
    if puedeCrearEventos(request.user):
        c = {}
        c.update({'user':request.user})
        request.breadcrumbs([('Eventos',reverse(index)),('Crear Evento',request.path)])
        if request.method == 'POST':
            form = EventForm(request.POST, request.FILES)
            if form.is_valid():
                form.save()
                return render_to_response('Eventos/success.html',c,context_instance = RequestContext(request))
        else:
            form = EventForm()
        c.update({'form':form})
        return render_to_response('Eventos/create.html',c,context_instance = RequestContext(request))

    return HttpResponseRedirect(reverse(index))

def edit_event_view(request,event_id,is_extern='False'):
    if puedeEditarEventos(request.user):
        c = {}
        request.breadcrumbs([('Eventos',reverse(index)),('Listar Eventos',reverse(list_all_events,args=['edit'])),('Editar Evento',request.path)])
        ev = Eventos.objects.get(pk=event_id)
        if request.method == 'POST':
            grupo = request.POST.getlist('grupos')
            listaGrupos = []
            for g in grupo:
                for s in g:
                    if s!=',':
                        listaGrupos.append(GruposDeInvestigacion.objects.get(pk=s))
            e = EventForm(request.POST.copy(), request.FILES,instance = ev)
            e.save()
            eventoModificar = Eventos.objects.get(id = event_id)
            for grupoEliminar in eventoModificar.grupos.all():
                eventoModificar.grupos.remove(grupoEliminar)
            for grupoAgregar in listaGrupos:
                eventoModificar.grupos.add(grupoAgregar)
            return render_to_response('Eventos/success_edit.html',{'user':request.user},context_instance = RequestContext(request))
        else:
            try:
                e = Eventos.objects.get(id = event_id)
                form = EventForm(instance = e)
                c.update(csrf(request))
                retGrupos = []
                retGruposAgregados = []
                json_serializer = serializers.get_serializer("json")()
                deptos = json_serializer.serialize(Departamentos.objects.all())
                grupos = GruposDeInvestigacion.objects.all()
                for l in grupos:
                    retGrupos.append({'id':l.id,'name':l.Nombre_grupo} )
                gruposAgregados = e.grupos.all()
                for l in gruposAgregados:
                    retGruposAgregados.append({'id':l.id,'name':l.Nombre_grupo})
                if not retGruposAgregados: retGruposAgregados=[]
                c.update({'form':form})
                c.update({'event_id':event_id})
                c.update({'deptos': simplejson.dumps(deptos)})
                c.update({'grupos': simplejson.dumps(retGrupos)})
                c.update({'gruposAgregados': simplejson.dumps(retGruposAgregados)})
                c.update({'event':e})
                if is_extern == 'True':
                    c.update({'user': e.Creador})
                else:
                    c.update({'user': request.user})

                return render_to_response('Eventos/edit.html',c,context_instance = RequestContext(request))
            except ObjectDoesNotExist:
                return render_to_response('Eventos/error.html',c,context_instance = RequestContext(request))

    return HttpResponseRedirect(reverse(index))
        
def view_event_view(request,event_id):
    request.breadcrumbs([('Eventos',reverse(index)),('Ver Evento',request.path)])
    try:
        event = Eventos.objects.get(id = event_id)
        return render_to_response('Eventos/view_events.html',{'user':request.user,'Evento':event, 'puedeEditar': puedeEditarEventos(request.user)},context_instance = RequestContext(request))
    except ObjectDoesNotExist:
        return render_to_response('Eventos/error.html',{'user':request.user},context_instance = RequestContext(request))
        
def list_all_events(request,operation_type):
    c = {}
    c.update({'user':request.user})
    eventos_grupos = []
    eventos_deptos = []
    usergroups = GruposDeInvestigacion.objects.filter(Miembros__id__exact = request.user.id)
    userdeptos = getDepartamentosByUser(request.user)
    if request.user.is_authenticated():
        for grupo in usergroups:
            for evento in Eventos.objects.filter(privacidad__iexact = 'Solo grupos'):
                for grev in evento.grupos.all():
                    if grupo.id == grev.id:
                        if not eventos_grupos.__contains__(evento):
                            eventos_grupos.append(evento)
                            break
        for depto in userdeptos:
            for evento in Eventos.objects.filter(privacidad__iexact = 'Solo departamentos'):
                for depev in evento.departamentos.all():
                    if depto.id == depev.id:
                        if not eventos_deptos.__contains__(evento):
                            eventos_deptos.append(evento)
                            break
    c.update({'eventos_grupos': eventos_grupos})
    c.update({'eventos_deptos': eventos_deptos})
    c.update({'operation':operation_type})
    c.update({'public':Eventos.objects.filter(privacidad__iexact = 'Todo el mundo')})
    request.breadcrumbs([('Eventos',reverse(index)),('Listar Eventos',request.path)])
    
    if operation_type == 'simple':
        c.update({'simple_display':Eventos.objects.all()})
        
    return render_to_response('Eventos/list.html',c,context_instance = RequestContext(request))

def getDepartamentosByUser(user):
    lista = []
    deptos = Departamentos.objects.all()
    for depto in deptos:
        if depto.esResponsable(user):
            lista.append(depto)
        elif depto.esMiembro(user):
            lista.append(depto)
    return lista

def ver(request, object_id):
    evento = obtenerEvento(request, object_id)
    if evento == 'No existe el objecto Evento':
        return render_to_response('error.html',{'error':'No existe el objecto Evento', 'archivo': 'view de Eventos', 'linea': 'linea 29'})

    request.breadcrumbs([('Eventos',reverse(index)),('Ver '+evento.Nombre_evento,request.path)])
    return render_to_response(
        'Eventos/detalles.html',
        {'Evento': evento, 'puedeEditar': puedeEditarEventos(request.user)},
        context_instance = RequestContext(request)
    )

def ajax_get_user_events(request,key_xhr):
    response_dict = {}
    
    lista = []
    if request.method == 'POST':
        ev = Eventos.objects.filter(creado_por__exact = request.user.username)
        ev1 = Eventos.objects.filter(creado_por = request.user.id)
        for e in ev:
            lista.append(e.Nombre_evento)
            
        for e in ev1:
            if not lista.__contains__(e.Nombre_evento):
                lista.append(e.Nombre_evento)
                
        response_dict.update({'list':lista})
        
        return HttpResponse(simplejson.dumps(response_dict),mimetype = 'application/javascript')

def ajax_get_users_groups_events(request,key_xhr):
    response_dict = {}

    ge = []
    who = request.POST.__getitem__('user')
    u = User.objects.get(username = who)
    
    gg = GruposDeInvestigacion.objects.filter(Miembros  = u)
    
    for g in gg:
        for event in g.eventos.all()[:3]:
            ge.append({'grupo':g.Nombre_grupo,'nombre_evento':event.Nombre_evento,'fecha_inicio':event.fecha_inicio.isoformat()})
            
    response_dict.update({'ok':True})
    response_dict.update({'events':ge})
    
    return HttpResponse(simplejson.dumps(response_dict),mimetype='application/javascript')

def ajax_get_public_events(request,key_xhr):
    response_dict = {}
    
    ret = []
    le = Eventos.objects.filter(privacidad__iexact = 'Todo el mundo')[:5]
    
    for e in le:
        ret.append({'nombre_evento':e.Nombre_evento,'fecha_inicio':e.fecha_inicio.isoformat()})
    
    response_dict.update({'ok':True})
    response_dict.update({'events':ret})
    
    return HttpResponse(simplejson.dumps(response_dict),mimetype = 'application/javascript')

def listardeptos(request, object_id=0):
    evento = obtenerEvento(request, object_id)
    if evento == 'No existe el objecto Evento':
        return render_to_response('error.html',{'error':'No existe el objecto Evento', 'archivo': 'view de Eventos', 'linea': 'linea 29'})
    request.breadcrumbs([('Eventos',reverse(index)),('Departamentos '+evento.Nombre_evento,request.path)])
    return render_to_response('Eventos/deptos.html', {'Evento': evento, 'list_deptos': evento.departamentos.all(), 'user': request.user}, context_instance=RequestContext(request))

def listargrupos(request, object_id=0):
    evento = obtenerEvento(request, object_id)
    if evento == 'No existe el objecto Evento':
        return render_to_response('error.html',{'error':'No existe el objecto Evento', 'archivo': 'view de Eventos', 'linea': 'linea 29'})
    request.breadcrumbs([('Eventos',reverse(index)),('Grupos '+evento.Nombre_evento,request.path)])
    return render_to_response('Eventos/grupos.html', {'Evento': evento, 'list_grupos': evento.grupos.all(), 'user': request.user}, context_instance=RequestContext(request))

